<?
/**
*		Chỉnh sửa: tuannk (20101208)
*		Phiên bản: 0.5
*		Ngày: 20-10-2010
*		Tên lớp: SohaPay
*		Chức năng: Tích hợp thanh toán qua API
*			- Xây dựng URL chuyển thông tin tới Soha Payment để xử lý việc thanh toán cho merchant site.
*			- Xác thực tính chính xác của thông tin đơn hàng được gửi về từ Soha Payment.
**/

class SohaPay 
{
	//list cac goi thanh toán online						   
	static $ebp 		= array(//335đ/up
							'EBUS1' => array(
										'type'	=>1,//1:EBU, 2:EBA, 3: EBD
										'value'	=>15,//lượt up
										'price'	=>5000,//VNĐ
										'des'	=>'15 lượt up',
										),
							'EBUS2' => array(
										'type'	=>1,//1:EBU, 2:EBA, 3: EBD
										'value'	=>20,//lượt up
										'price'	=>6700,//VNĐ
										'des'	=>'20 lượt up',
										),
							'EBUS3' => array(
										'type'	=>1,//1:EBU, 2:EBA, 3: EBD
										'value'	=>40,//lượt up
										'price'	=>15000,//VNĐ
										'des'	=>'40 lượt up',
										),
							'EBUS4' => array(
										'type'	=>1,//1:EBU, 2:EBA, 3: EBD
										'value'	=>100,//lượt up
										'price'	=>42000,//VNĐ
										'des'	=>'100 lượt up',
										),
							'EBU01' => array(
										'type'	=>1,//1:EBU, 2:EBA, 3: EBD
										'value'	=>150,//lượt up
										'price'	=>50000,//VNĐ
										'des'	=>'150 lượt up',
										),
										
							'EBU02' => array('type'	=>1,'value'	=>300,'price'	=>100000,'des'	=>'300 lượt up'),
							'EBU03' => array('type'	=>1,'value'	=>600,'price'	=>200000,'des'	=>'600 lượt up'),
							'EBU04' => array('type'	=>1,'value'	=>1600,'price'	=>500000,'des'	=>'1.600 lượt up'),
							'EBU05' => array('type'	=>1,'value'	=>3300,'price'	=>1000000,'des'	=>'3.300 lượt up'),
							'EBU06' => array('type'	=>1,'value'	=>4900,'price'	=>1500000,'des'	=>'4.900 lượt up'),
							'EBU07' => array('type'	=>1,'value'	=>7000,'price'	=>2000000,'des'	=>'7.000 lượt up'),
							'EBU08' => array('type'	=>1,'value'	=>10500,'price'	=>3000000,'des'	=>'10.500 lượt up'),
							'EBU09' => array('type'	=>1,'value'	=>14500,'price'	=>4000000,'des'	=>'14.500 lượt up'),
							'EBU10' => array('type'	=>1,'value'	=>18500,'price'	=>5000000,'des'	=>'18.500 lượt up'),
							'EBU11' => array('type'	=>1,'value'	=>40000,'price'	=>10000000,'des'=>'40.000 lượt up'),
							
							//Hoàng Ngọc Anh 2010.01.11 14h52 -> 2011.02.17 14h50
							/*
							'EBU02' => array('type'	=>1,'value'	=>315,'price'	=>100000,'des'	=>'300 lượt up (và 15 lượt up khuyến mại)'),
							'EBU03' => array('type'	=>1,'value'	=>630,'price'	=>200000,'des'	=>'600 lượt up (và 30 lượt up khuyến mại)'),
							'EBU04' => array('type'	=>1,'value'	=>1680,'price'	=>500000,'des'	=>'1.600 lượt up (và 80 lượt up khuyến mại)'),
							'EBU05' => array('type'	=>1,'value'	=>3531,'price'	=>1000000,'des'	=>'3.300 lượt up (và 231 lượt up khuyến mại)'),
							'EBU06' => array('type'	=>1,'value'	=>5243,'price'	=>1500000,'des'	=>'4.900 lượt up (và 343 lượt up khuyến mại)'),
							'EBU07' => array('type'	=>1,'value'	=>7490,'price'	=>2000000,'des'	=>'7.000 lượt up (và 490 lượt up khuyến mại)'),
							'EBU08' => array('type'	=>1,'value'	=>11550,'price'	=>3000000,'des'	=>'10.500 lượt up (và 1.050 lượt up khuyến mại)'),
							'EBU09' => array('type'	=>1,'value'	=>15950,'price'	=>4000000,'des'	=>'14.500 lượt up (và 1.450 lượt up khuyến mại)'),
							'EBU10' => array('type'	=>1,'value'	=>20350,'price'	=>5000000,'des'	=>'18.500 lượt up (và 1.850 lượt up khuyến mại)'),
							'EBU11' => array('type'	=>1,'value'	=>46000,'price'	=>10000000,'des'=>'40.000 lượt up (và 6.000 lượt up khuyến mại)'),
							*/
							//'EBA' 	=> array('type'	=>2,'value'	=>0,'price'	=>50000,'des'=>'Kích hoạt THÀNH VIÊN CHÍNH THỨC'),
							
							'EBD01' => array('type'	=>3,'value'	=>150,'price'	=>50000,'des'	=>'150 lượt up lẻ'),
							
							'EBD02' => array('type'	=>3,'value'	=>300,'price'	=>100000,'des'	=>'300 lượt up lẻ'),
							'EBD03' => array('type'	=>3,'value'	=>600,'price'	=>200000,'des'	=>'600 lượt up lẻ'),
							
							'EBD04' => array('type'	=>3,'value'	=>900,'price'	=>300000,'des'	=>'900 lượt up lẻ'),//Thêm 2010.12.17
							'EBD05' => array('type'	=>3,'value'	=>1300,'price'	=>400000,'des'	=>'1.300 lượt up lẻ'),//Thêm 2010.12.17
							
							'EBD06' => array('type'	=>3,'value'	=>1600,'price'	=>500000,'des'	=>'1.600 lượt up lẻ'),
							
							'EBD07' => array('type'	=>3,'value'	=>1900,'price'	=>600000,'des'	=>'1.900 lượt up lẻ'),//Thêm 2010.12.17
							'EBD08' => array('type'	=>3,'value'	=>2200,'price'	=>700000,'des'	=>'2.200 lượt up lẻ'),//Thêm 2010.12.17
							'EBD09' => array('type'	=>3,'value'	=>2500,'price'	=>800000,'des'	=>'2.500 lượt up lẻ'),//Thêm 2010.12.17
							'EBD10' => array('type'	=>3,'value'	=>2800,'price'	=>900000,'des'	=>'2.800 lượt up lẻ'),//Thêm 2010.12.17
							
							'EBD11' => array('type'	=>3,'value'	=>3300,'price'	=>1000000,'des'	=>'3.300 lượt up lẻ'),
							'EBD12' => array('type'	=>3,'value'	=>5200,'price'	=>1500000,'des'	=>'5.200 lượt up lẻ'),
							'EBD13' => array('type'	=>3,'value'	=>7000,'price'	=>2000000,'des'	=>'7.000 lượt up lẻ'),
							'EBD14' => array('type'	=>3,'value'	=>10500,'price'	=>3000000,'des'	=>'10.500 lượt up lẻ'),
							
							//Hoàng Ngọc Anh 2010.01.11 14h52 -> 2011.02.17 14h50
							/*
							'EBD02' => array('type'	=>3,'value'	=>315,'price'	=>100000,'des'	=>'300 lượt up lẻ (và 15 lượt up khuyến mại)'),
							'EBD03' => array('type'	=>3,'value'	=>630,'price'	=>200000,'des'	=>'600 lượt up lẻ (và 30 lượt up khuyến mại)'),
							
							'EBD04' => array('type'	=>3,'value'	=>945,'price'	=>300000,'des'	=>'900 lượt up lẻ (và 45 lượt up khuyến mại)'),//Thêm 2010.12.17
							'EBD05' => array('type'	=>3,'value'	=>1260,'price'	=>400000,'des'	=>'1.200 lượt up lẻ (và 60 lượt up khuyến mại)'),//Thêm 2010.12.17
							
							'EBD06' => array('type'	=>3,'value'	=>1680,'price'	=>500000,'des'	=>'1.600 lượt up lẻ (và 80 lượt up khuyến mại)'),
							
							'EBD07' => array('type'	=>3,'value'	=>1995,'price'	=>600000,'des'	=>'1.900 lượt up lẻ (và 95 lượt up khuyến mại)'),//Thêm 2010.12.17
							'EBD08' => array('type'	=>3,'value'	=>2310,'price'	=>700000,'des'	=>'2.200 lượt up lẻ (và 110 lượt up khuyến mại)'),//Thêm 2010.12.17
							'EBD09' => array('type'	=>3,'value'	=>2625,'price'	=>800000,'des'	=>'2.500 lượt up lẻ (và 125 lượt up khuyến mại)'),//Thêm 2010.12.17
							'EBD10' => array('type'	=>3,'value'	=>2940,'price'	=>900000,'des'	=>'2.800 lượt up lẻ (và 140 lượt up khuyến mại)'),//Thêm 2010.12.17
							
							'EBD11' => array('type'	=>3,'value'	=>3531,'price'	=>1000000,'des'	=>'3.300 lượt up lẻ (và 231 lượt up khuyến mại)'),
							'EBD12' => array('type'	=>3,'value'	=>5564,'price'	=>1500000,'des'	=>'5.200 lượt up lẻ (và 364 lượt up khuyến mại)'),
							'EBD13' => array('type'	=>3,'value'	=>7490,'price'	=>2000000,'des'	=>'7.000 lượt up lẻ (và 490 lượt up khuyến mại)'),
							'EBD14' => array('type'	=>3,'value'	=>11550,'price'	=>3000000,'des'	=>'10.500 lượt up lẻ (và 1050 lượt  up khuyến mại)'),
							*/
							
							
							//'EBD09' => array('type'	=>3,'value'	=>14500,'price'	=>4000000,'des'	=>'14.500 lượt up lẻ'),
							//'EBD10' => array('type'	=>3,'value'	=>18500,'price'	=>5000000,'des'	=>'18.500 lượt up lẻ'),
							//'EBD11' => array('type'	=>3,'value'	=>40000,'price'	=>10000000,'des'=>'40.000 lượt up lẻ'),
							);
							
    //list giá và số ngày được phép mua của từng chuyên mục

    static $vip         = array(
                                'V01' => array(
                                    'type' => 5,
                                    'price' => 250000, //giá
                                    'ids'   => '331'// chuyên muc
                                ),
                                'V02' => array(
                                    'type' => 5,
                                    'price' => 200000, //giá
                                    'ids'   => '1,30'// chuyên muc
                                ),
                                'V03'   => array(
									'type' => 5,
									'price' => 180000,
									'ids' => '78,51,451,592,105,579,103,571'
								),
                                'V04'   => array(
									'type' => 5,
									'price' => 120000,
									'ids' => '31,107,100,447,109,332,335,337'
								),
                                'V05'   => array(
									'type' => 5,
									'price' => 100000,
									'ids' => '101,514,79,81,84,83.541,174,173,82,521,33,36,311,44,34,38,306,64,597,39,47,35,40,60,37,41,43,2,3,304,29,6,4,8,14,7,13,24,305,5,15,25'
								),
								'V06'   => array(
									'type' => 5,
									'price' => 90000,
									'ids' => '445,45,61,603,516,605,607,52,53,54,55,56,57,58,587,59,242,415,475,246,354,559,247,476,396,243,452,144,357,245,462,251,119,113,468,117,123,120,130,139,111,359,360,405,408,403,457,456,395,244,454,455,474,248,556,252,583,567,566,569,584,560,561,575,562,574,573,563,564,565,320,321,568,580,581,570'
								),
								'V07'   => array(
									'type' => 5,
									'price' => 60000,
									'ids' => '465,467,464,466,358,608,178,250,450,449,397,399,356,400,554,469,596,463,205,206,207,210,290,291,312,309,491,429,289,509,510,513,531,585,586,303,233,582,234,235,236,380,349,350,427,553,428,351,352,425,426,65,438,68,439,67,69,598,73,599,75,369,281,278,280,282,285,284,308,279,287'
								),
								'V08'   => array(
									'type' => 5,
									'price' => 50000,
									'ids' => '611,477,478,202,198,203,200,557,595,201,204,515,520,530,519,512,511,532,94,97,404,96,98,141,363,124,125,110,137,127,361,95,555,136,362,128,590,99,146,588,589,444,147,150,148,151,591,149,371,153,86,392,391,388,89,390,436,437,91,90,92,93,170,171,172,158,160,163,156,162,164,166,161,165,159,167,446,169,542,543,544,545,546,547,548,549,192,191,383,381,193,194,382,384,385,550,551,195,196,386,197,313,182,179,185,180,181,183,184,188,175,190,552,189,499,387,176,500,501,502,507,540,504,505,535,539,534,537,503,536,538,506,522,524,525,526,523,529,527,528'
								),
                                'V09' => array(
                                    'type' => 5,
                                    'price' => 150000, //giá
                                    'ids'   => '223,224,225,227,226,228,229,230,416,231,232,479,417,418,421,239'// chuyên muc
                                ),
    );

    static $card 		= array(
							10000   => array(
										'value'	=>20,//lượt up
										'price'	=>10000,//VNĐ
										'des'	=>'20 lượt up',
										),

							20000   => array('value'   => 40,   'price'	=>20000  ,'des'    =>'40 lượt up'),
							30000   => array('value'   => 60,   'price'	=>30000  ,'des'    =>'60 lượt up'),
                            50000   => array('value'   => 100,  'price'	=>50000  ,'des'    =>'100 lượt up'),
							100000  => array('value'   => 210,  'price'	=>100000 ,'des'    =>'210 lượt up'),
							200000  => array('value'   => 430,  'price'	=>200000 ,'des'    =>'430 lượt up'),
							300000  => array('value'   => 650,  'price'	=>300000 ,'des'    =>'650 lượt up'),
							500000  => array('value'   => 1300, 'price'	=>500000 ,'des'    =>'1300 lượt up'),
    );
    
	//Hàm xây dựng url, trong đó có tham số mã hóa (còn gọi là public key)
	static function buildCheckoutUrl($return_url, $transaction_info, $order_code, $price, $order_email='',$site_code,$secure_code)
	{
		
		// Mảng các tham số chuyển tới Soha Payment
		$arr_param = array(
			'site_code'			=>	strval($site_code),
			'return_url'		=>	strval($return_url),
			'transaction_info'	=>	strval($transaction_info),
			'order_code'		=>	strval($order_code),
			'price'				=>	strval($price),	
			'order_email'		=>	strval($order_email),
		);
		
		ksort($arr_param);
		/* Bước 2. Kiểm tra  biến $redirect_url xem có '?' không, nếu không có thì bổ sung vào*/
		$redirect_url = SOHA_PAYMENT_CHECK_OUT_URL;
		if (strpos($redirect_url, '?') === false)
		{
			$redirect_url .= '?';
		}
		else if (substr($redirect_url, strlen($redirect_url)-1, 1) != '?' && strpos($redirect_url, '&') === false)
		{
			// Nếu biến $redirect_url có '?' nhưng không kết thúc bằng '?' và có chứa dấu '&' thì bổ sung vào cuối
			$redirect_url .= '&';			
		}
				
		/* Bước 3. tạo url*/
		$first = true;
		$secure_code = $secure_code;
		foreach ($arr_param as $key=>$value)
		{
			if ($first == true){
				$redirect_url .= urlencode($key) . '=' . urlencode($value);
				$first = false;
			}
			else
				$redirect_url .= '&' . urlencode($key) . '=' . urlencode($value);
			
			$secure_code .= $value;
		}
		
		if (strlen($secure_code) > 0) {
		    $redirect_url .= "&secure_hash=" . strtoupper(md5($secure_code));
		}
		
		return $redirect_url;
	}
	
	/*Hàm thực hiện xác minh tính đúng đắn của các tham số trả về từ Soha Payment*/
	
	static function verifyReturnUrl($secure_code)
	{
		$secure_hash 				= @$_GET['secure_code'];
		unset($_GET['secure_code']);
	
		$param['transaction_info']	= @$_GET['transaction_info'];
		$param['order_code'] 		= @$_GET['order_code'];
		$param['order_email'] 		= @$_GET['order_email'];
		$param['order_session'] 	= @$_GET['order_session'];
		$param['price'] 			= @$_GET['price'];
		$param['site_code'] 		= @$_GET['site_code'];
		$param['response_code'] 	= @$_GET['response_code'];
		$param['response_message'] 	= @$_GET['response_message'];
		$param['payment_type'] 		= @$_GET['payment_type'];
		$param['payment_time'] 		= @$_GET['payment_time'];
		$param['error_text'] 		= @$_GET['error_text'];
	
		ksort($param);
		$md5HashData = $secure_code;	
	
	    foreach($param as $key => $value) {
	        if ($key != "secure_code" or strlen($value) > 0) {
	            $md5HashData .= urldecode($value);
	        }
	    }
	    
	    if (strtoupper($secure_hash) == strtoupper(md5($md5HashData))) {
	        return TRUE;
	    } else {
	        return FALSE;
	    }
	}
	
	static function queryOrderStatus($order_code,$site_code,$secure_code){
		// Mảng các tham số chuyển tới Soha Payment
		$arr_param = array(
			'site_code'			=>	strval($site_code),
			'order_code'		=>	strval($order_code),
			'command'			=>	'query'
		);
		
		ksort($arr_param);
		/* Bước 2. Kiểm tra  biến $redirect_url xem có '?' không, nếu không có thì bổ sung vào*/
		$query_url = SOHA_PAYMENT_QUERY_URL;
		if (strpos($query_url, '?') === false)
		{
			$query_url .= '?';
		}
		else if (substr($query_url, strlen($query_url)-1, 1) != '?' && strpos($query_url, '&') === false)
		{
			// Nếu biến $redirect_url có '?' nhưng không kết thúc bằng '?' và có chứa dấu '&' thì bổ sung vào cuối
			$query_url .= '&';			
		}
				
		/* Bước 3. tạo url*/
		$first = true;

		foreach ($arr_param as $key=>$value)
		{
			if ($first == true){
				$query_url .= urlencode($key) . '=' . urlencode($value);
				$first = false;
			}
			else
				$query_url .= '&' . urlencode($key) . '=' . urlencode($value);
			
			$secure_code .= $value;
		}
		
		if (strlen($secure_code) > 0) {
		    $query_url .= "&secure_hash=" . strtoupper(md5($secure_code));
		}
		
		ob_start();
	
		// initialise Client URL object
		$ch = curl_init();
	
		// set the URL of the VPC
		curl_setopt ($ch, CURLOPT_URL, $query_url);
		curl_setopt ($ch, CURLOPT_POST, 0);
		curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
		curl_exec ($ch);
	
		// get response
		$response = ob_get_contents();
		
		// turn output buffering off.
		ob_end_clean();
		
		$map = array();
	
	    $pairArray = split("&", $response);
	    foreach ($pairArray as $pair) {
	        $param = split("=", $pair);
	        $map[urldecode($param[0])] = urldecode($param[1]);
	    }
	    
	    $map['shp_payment_response_description'] = '';
	    if ($map['shp_payment_type']==1) $map['shp_payment_response_description'] = self::getResponseDescriptionInternational($map['shp_payment_response_code']);
	    else if ($map['shp_payment_type']==2) $map['shp_payment_response_description'] = self::getResponseDescriptionDomestic($map['shp_payment_response_code']);
	    
	    return $map;
	}
	
	static function getResponseDescriptionInternational($responseCode) {
	    switch ($responseCode) {
	        case "0" : $result = "Giao dịch thành công"; break;
	        case "?" : $result = "Tình trạng giao dịch không xác định"; break;
	        case "1" : $result = "Lỗi không xác định"; break;
	        case "2" : $result = "Ngân hàng từ tối giao dịch"; break;
	        case "3" : $result = "Không có trả lời từ Ngân hàng"; break;
	        case "4" : $result = "Thẻ hết hạn"; break;
	        case "5" : $result = "Số dư không đủ để thanh toán"; break;
	        case "6" : $result = "Lỗi giao tiếp với Ngân hàng"; break;
	        case "7" : $result = "Lỗi Hệ thống máy chủ Thanh toán"; break;
	        case "8" : $result = "Loại giao dịch không được hỗ trợ"; break;
	        case "9" : $result = "Ngân hàng từ chối giao dịch (không liên hệ với Ngân hàng)"; break;
	        case "A" : $result = "giao dịch Aborted"; break;
	        case "B" : $result = "Bị chặn do có rủi ro giả mạo"; break;
	        case "C" : $result = "giao dịch bị hủy bỏ"; break;
	        case "D" : $result = "giao dịch hoãn lại đã được nhận và đang chờ xử lý"; break;
	        case "E" : $result = "Referred"; break;
	        case "F" : $result = "3D Secure xác thực không thành công"; break;
	        case "I" : $result = "Card Security Code xác minh không thành công"; break;
	        case "L" : $result = "Mua sắm giao dịch đã bị khoá (Xin vui lòng thử lại sau giao dịch)"; break;
	        case "N" : $result = "Chủ thẻ không ghi danh vào chương trình xác thực"; break;
	        case "P" : $result = "giao dịch đã được nhận bởi các Adaptor Thanh toán và đang được xử lý"; break;
	        case "R" : $result = "giao dịch đã không được xử lý - Đã đạt đến giới hạn của những cố gắng thử lại cho phép"; break;
	        case "S" : $result = "SessionID bị trùng (OrderInfo)"; break;
	        case "T" : $result = "Địa chỉ xác minh không đúng"; break;
	        case "U" : $result = "Card Security Code không đúng"; break;
	        case "V" : $result = "Địa chỉ xác minh và Card Security Code không đúng"; break;
	        case "9999": $result = "Giao dịch có rủi ro giả mạo";break;
	        case "PG": $result = "Không tồn tại giao dịch trên hệ thống";break;
	        default  : $result = "Không thể xác định"; 
	    }
	    return $result;
	}
	
	static function getResponseDescriptionDomestic($responseCode){
		switch ($responseCode) {
	        case "0" : $result = "Giao dịch thành công"; break;
	        case "1" : $result = "Ngân hàng từ chối giao dịch"; break;
	        case "3" : $result = "Mã đơn vị không tồn tại"; break;
	        case "4" : $result = "Không đúng access code"; break;
	        case "5" : $result = "Số tiền không hợp lệ"; break;
	        case "6" : $result = "Mã tiền tệ không tồn tại"; break;
	        case "7" : $result = "Lỗi không xác định"; break;
	        case "8" : $result = "Số thẻ không đúng"; break;
	        case "9" : $result = "Tên chủ thẻ không đúng"; break;
	        case "10" : $result = "Thẻ hết hạn/Thẻ bị khóa"; break;
	        case "11" : $result = "Thẻ chưa đăng ký sử dụng dịch vụ thanh toán trực tuyến."; break;
	        case "12" : $result = "Ngày phát hành/Hết hạn không đúng"; break;
	        case "13" : $result = "Vượt quá hạn mức thanh toán"; break;
	        case "21" : $result = "Số dư không đủ để thanh toán"; break;
	        case "99" : $result = "Người sử dụng hủy giao dịch"; break;
	        case "100" : $result = "Không nhập thông tin thẻ/ Hủy giao dịch thanh toán"; break;
	        case "PG": $result = "Không tồn tại giao dịch trên hệ thống";break;
	        default  : $result = "Không thể xác định";
		}
		return $result;
	}

    static function listBankCode($banking_type){
        switch ($banking_type) {
                case "mb_bank"      : $result = 1; break;
                case "acb_bank"     : $result = 2; break;
                case "vc_bank"      : $result = 3; break;
                case "vib_bank"     : $result = 4; break;
                case "donga_bank"   : $result = 5; break;
                case "techcom_bank" : $result = 6; break;
                case "bidv_bank"    : $result = 7; break;
                case "vietinbank"   : $result = 8; break;
                case "agribank"     : $result = 9; break;
                default             : $result = "Không thể xác định";break;
            }
        return $result;
    }

    static function listBanking($bankCode, $note=false){
        if(!$note){
            switch ($bankCode) {
                case "1" : $result = "Ngân hàng thương mại cổ phần Quân đội"; break;
                case "2" : $result = "Ngân hàng Á Châu chi nhánh Hà Nội (ACB)"; break;
                case "3" : $result = "Ngân hàng Vietcombank (VCB) Hà Nội"; break;
                case "4" : $result = "Ngân hàng TMCP Quốc tế Việt Nam(VIB)"; break;
                case "5" : $result = "Ngân hàng Đông Á chi nhánh Bạch Mai Hà Nội"; break;
                case "6" : $result = "Ngân hàng TECHCOMBANK Hà Nội"; break;
                case "7" : $result = "Ngân hàng Đầu Tư và Phát Triển Việt Nam (BIDV)"; break;
                case "8" : $result = "Ngân hàng TMCP Công Thương Việt Nam (Vietinbank)"; break;
                case "9" : $result = "Ngân hàng Nông Nghiệp và Phát Triển Nông Thôn Việt Nam (Agribank)"; break;
                default  : $result = "Không thể xác định";break;
            }
        }else{
            switch ($bankCode) {
                case "1" : $result = "Ngân hàng thương mại cổ phần Quân đội: Chấp nhận chuyển qua ATM, nộp tiền trực tiếp tại ngân hàng."; break;
                case "2" : $result = "Ngân hàng Á Châu chi nhánh Hà Nội (ACB)): Chấp nhận chuyển qua ATM, nộp tiền trực tiếp tại ngân hàng."; break;
                case "3" : $result = "Ngân hàng Vietcombank (VCB) Hà Nội: Chấp nhận chuyển khoản qua ATM, nộp tiền trực tiếp tại ngân hàng nhưng không được chuyển khoản online từ tài khản cá nhân sang tài khoản công ty. "; break;
                case "4" : $result = "Ngân hàng TMCP Quốc tế Việt Nam(VIB)): Chấp nhận chuyển qua ATM, nộp tiền trực tiếp tại ngân hàng."; break;
                case "5" : $result = "Ngân hàng Đông Á chi nhánh Bạch Mai Hà Nội: Khách hàng chỉ có thể nộp tiền trực tiếp tại ngân hàng hoặc chuyển ATM từ Đông Á sang Đông Á"; break;
                case "6" : $result = "Ngân hàng TECHCOMBANK Hà Nội: Chấp nhận chuyển qua ATM, nộp tiền trực tiếp tại ngân hàng."; break;
                case "7" : $result = "Ngân hàng Đầu Tư và Phát Triển Việt Nam (BIDV): Khách hàng chỉ có thể nộp tiền trực tiếp tại ngân hàng hoặc chuyển ATM từ BIDV sang BIDV"; break;
                case "8" : $result = "Ngân hàng TMCP Công Thương Việt Nam (Vietinbank): Chấp nhận chuyển khoản qua ATM, nộp tiền trực tiếp tại ngân hàng nhưng không được chuyển khoản online từ tài khản cá nhân sang tài khoản công ty."; break;
                case "9" : $result = "Ngân hàng Nông Nghiệp và Phát Triển Nông Thôn Việt Nam (Agribank): Khách hàng chỉ có thể nộp tiền trực tiếp tại ngân hàng hoặc chuyển ATM từ Agribank sang Agribank"; break;
                default  : $result = "Không thể xác định";break;
            }
        }
		
		return $result;
	}

    static function listAccountNumber($bankCode){
		switch ($bankCode) {
	        case "1" : $result = "0651100016002"; break; //Ngân hàng thương mại cổ phần Quân đội 
	        case "2" : $result = "37182319"; break; //Ngân hàng Á Châu chi nhánh Hà Nội (ACB)
	        case "3" : $result = "0021001839243"; break; //Ngân hàng Vietcombank (VCB) Hà Nội 
	        case "4" : $result = "001704060035755"; break; //Ngân hàng TMCP Quốc tế Việt Nam(VIB) - Sở Giao dịch VIB 
	        case "5" : $result = "002387340001"; break;//Ngân hàng Đông Á chi nhánh Bạch Mai Hà Nội
	        case "6" : $result = "10320141354011"; break;//Ngân hàng TECHCOMBANK Hà Nội
	        case "7" : $result = "12010000318895"; break;//Ngân hàng Đầu Tư và Phát Triển Việt Nam
	        case "8" : $result = "102010001108169"; break;//Ngân hàng TMCP Công Thương Việt Nam (Vietinbank)
	        case "9" : $result = "1483201004740"; break;//Ngân hàng Nông Nghiệp và Phát Triển Nông Thôn Việt Nam (Agribank)
	        default  : $result = "Không thể xác định";break;

		}
		return $result;
	}

    static function infoForUser($val,$type){
        $re="";
        if($type == 'tp'){
            switch ($val) {
                case "1":
                    $re = "Hà Nội";
                    break;
                case "2":
                    $re = "Hồ Chí Minh";
                    break;
            }
        }else if($type == 'time'){
            switch ($val) {
                case "1":
                    $re = "Sáng";
                    break;
                case "2":
                    $re = "Chiều";
                    break;
                case "3":
                    $re = "Tối";
                    break;
            }
        }
        return $re;
    }

    //cac ham cho phan nap the cao
    static function doChargeCard($card_code, $card_type, $transaction_info, $order_code, $order_email, $order_mobile,$site_code,$secure_code){
		// Mảng các tham số chuyển tới Soha Payment
		$arr_param = array(
			'site_code'			=>	strval($site_code),
			'card_code'			=>	strval($card_code),
			'card_type'			=>	strval($card_type), // vinaphone or mobifone
			'transaction_info'	=>	strval($transaction_info),
			'order_code'		=>	strval($order_code),
			'order_email'		=>	strval($order_email),
			'order_mobile'		=>	strval($order_mobile),
			'command'			=>	'doChargeMobileCard'
		);

		ksort($arr_param);
		/* Bước 2. Kiểm tra  biến $redirect_url xem có '?' không, nếu không có thì bổ sung vào*/
        if(SOHA_PAYMENT_QUERY_URL != 'https://pay.soha.vn/payment_query.php'){
            $query_url = 'https://pay.soha.vn/payment_query.php';
        }else{
            $query_url = SOHA_PAYMENT_QUERY_URL;
        }
		
		if (strpos($query_url, '?') === false)
		{
			$query_url .= '?';
		}
		else if (substr($query_url, strlen($query_url)-1, 1) != '?' && strpos($query_url, '&') === false)
		{
			// Nếu biến $redirect_url có '?' nhưng không kết thúc bằng '?' và có chứa dấu '&' thì bổ sung vào cuối
			$query_url .= '&';
		}

		/* Bước 3. tạo url*/
		$first = true;
		$secure_code = $secure_code;
		foreach ($arr_param as $key=>$value)
		{
			if ($first == true){
				$query_url .= urlencode($key) . '=' . urlencode($value);
				$first = false;
			}
			else
				$query_url .= '&' . urlencode($key) . '=' . urlencode($value);

			$secure_code .= $value;
		}

		if (strlen($secure_code) > 0) {
		    $query_url .= "&secure_hash=" . strtoupper(md5($secure_code));
		}

		ob_start();

		// initialise Client URL object
		$ch = curl_init();

		// set the URL of the VPC
		curl_setopt ($ch, CURLOPT_URL, $query_url);
		curl_setopt ($ch, CURLOPT_POST, 0);
		curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
		curl_exec ($ch);

		// get response
		$response = ob_get_contents();

		// turn output buffering off.
		ob_end_clean();

		// close client URL
		curl_close ($ch);

		$map = array();
		$response = substr($response, 1);

	    $pairArray = split("&", $response);
	    foreach ($pairArray as $pair) {
	        $param = split("=", $pair);
	        $map[urldecode($param[0])] = urldecode($param[1]);
	    }

	    $map['shp_payment_response_description'] = SohaPay::getResponseDescriptionMobileCard($map['response_code']);

	    return $map;
	}

    static function getResponseDescriptionMobileCard($responseCode){
		switch ($responseCode) {
	        case "1" : $result = "Giao dịch thành công"; break;
	        case "-1" : $result = "Thẻ đã sử dụng"; break;
	        case "-2" : $result = "Thẻ đã khoá"; break;
	        case "-3" : $result = "Thẻ đã hết hạn sử dụng"; break;
	        case "-4" : $result = "Thẻ chưa kích hoạt"; break;
	        case "-10" : $result = "Mã thẻ không đúng định dạng"; break;
	        case "-12" : $result = "Thẻ không tồn tại"; break;
	        case "-99" : $result = "Lỗi hệ thống nạp của Mobile"; break;
	        case "0" : $result = "Lỗi khác"; break;
	        case "2" : $result = "Không login sử dụng các hàm charge"; break;
	        case "3" : $result = "Lỗi hệ thống của VDCO"; break;
	        case "4" : $result = "Thẻ không sử dụng được "; break;
	        case "5" : $result = "Thực hiện sai 5 lần liên tiếp"; break;
	        case "6" : $result = "Thực hiện lệnh logout không thành công"; break;
	        case "8" : $result = "Charge thẻ bị lỗi hệ thống. Lỗi này cần kiểm soát và đối soát"; break;
	        case "9" : $result = "Thông tin partner không đúng"; break;
	        case "10" : $result = "Sai format thông tin email hoặc mobile"; break;
	        default  : $result = "Không thể xác định";
		}
		return $result;
	}

    static function showResponseMobileCard($responseCode){
		switch ($responseCode) {
	        case "1" : $result = "Giao dịch thành công"; break;
	        case "-1" : $result = "Thẻ đã sử dụng"; break;
	        case "-2" : $result = "Thẻ đã khoá"; break;
	        case "-3" : $result = "Thẻ đã hết hạn sử dụng"; break;
	        case "-4" : $result = "Thẻ chưa kích hoạt"; break;
	        case "-10" : $result = "Mã thẻ không đúng định dạng"; break;
	        case "-12" : $result = "Thẻ không tồn tại"; break;
	        //case "-99" : $result = "Lỗi hệ thống nạp của Mobile"; break;
	        //case "0" : $result = "Lỗi khác (Mobifone)"; break;
			//case "2" : $result = "Không login sử dụng các hàm charge"; break;
	        //case "3" : $result = "Lỗi hệ thống của VDCO"; break;
	        case "4" : $result = "Thẻ không sử dụng được"; break;
	        case "5" : $result = "Thực hiện sai 5 lần liên tiếp"; break;
	        //case "6" : $result = "Thực hiện lệnh logout không thành công"; break;
	        //case "8" : $result = "Charge thẻ bị lỗi hệ thống. Lỗi này cần kiểm soát và đối soát"; break;
	        //case "9" : $result = "Thông tin partner không đúng"; break;
	        case "10" : $result = "Sai định dạng thông tin email hoặc mobile"; break;
	        default  : $result = "Không nạp được thẻ";
		}
		return $result;
	}
}
?>